#ifndef _STM32F4XX_GPIO_H
#define _STM32F4XX_GPIO_H

#include "stm32f4xx.h"
#define GPIO_Pin_0          ((uint16_t)(1 << 0))
#define GPIO_Pin_1          ((uint16_t)(1 << 1))
#define GPIO_Pin_2          ((uint16_t)(1 << 2))
#define GPIO_Pin_3          ((uint16_t)(1 << 3))
#define GPIO_Pin_4          ((uint16_t)(1 << 4))
#define GPIO_Pin_5          ((uint16_t)(1 << 5))
#define GPIO_Pin_6          ((uint16_t)(1 << 6))
#define GPIO_Pin_7          ((uint16_t)(1 << 7))
#define GPIO_Pin_8          ((uint16_t)(1 << 8))
#define GPIO_Pin_9          ((uint16_t)(1 << 9))
#define GPIO_Pin_10         ((uint16_t)(1 << 10))
#define GPIO_Pin_11         ((uint16_t)(1 << 11))
#define GPIO_Pin_12         ((uint16_t)(1 << 12))
#define GPIO_Pin_13         ((uint16_t)(1 << 13))
#define GPIO_Pin_14         ((uint16_t)(1 << 14))
#define GPIO_Pin_15         ((uint16_t)(1 << 15))
#define GPIO_Pin_All        ((uint16_t)(0xffff))

/**
 * @brief 定义GPIO的工作模式枚举类型
 */
typedef enum {
    GPIO_Mode_IN = 0x00,  /* 输入模式 */
    GPIO_Mode_OUT = 0x01, /* 输出模式 */
    GPIO_Mode_AF = 0x02,  /* 复用功能模式 */
    GPIO_Mode_AN = 0x03   /* 模拟模式 */
} GPIOMode_TypeDef;

/**
 * @brief 定义GPIO的输出类型枚举类型
 */
typedef enum {
    GPIO_OType_PP = 0x00, /* 推挽输出 */
    GPIO_OType_OD = 0x01  /* 开漏输出 */
} GPIOOType_TypeDef;

/**
 * @brief 定义GPIO的上拉/下拉配置枚举类型
 */
typedef enum {
    GPIO_PuPd_NOPULL = 0x00, /* 无上下拉 */
    GPIO_PuPd_UP = 0x01,     /* 上拉 */
    GPIO_PuPd_DOWN = 0x02    /* 下拉 */
} GPIOPuPd_TypeDef;

/**
 * @brief 定义GPIO的输出速度配置枚举类型
 */
typedef enum {
    GPIO_Speed_2MHz = 0x00,  /* 低速，2MHz */
    GPIO_Speed_25MHz = 0x01, /* 中速，25MHz */
    GPIO_Speed_50MHz = 0x02, /* 高速，50MHz */
    GPIO_Speed_100MHz = 0x03 /* 超高速，100MHz */
} GPIOSpeed_TypeDef;

/**
 * @brief 定义GPIO的初始化结构体
 */
typedef struct {
    uint16_t GPIO_Pin;
    GPIOMode_TypeDef Mode;    /* GPIO的工作模式，使用GPIOMode_TypeDef枚举类型 */
    GPIOOType_TypeDef OType;  /* GPIO的输出类型，使用GPIOOType_TypeDef枚举类型 */
    GPIOPuPd_TypeDef PuPd;    /* GPIO的上拉/下拉配置，使用GPIOPuPd_TypeDef枚举类型 */
    GPIOSpeed_TypeDef Speed;  /* GPIO的输出速度配置，使用GPIOSpeed_TypeDef枚举类型 */
} GPIO_InitTypeDef;



void GPIO_SetBits(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);

void GPIO_ResetBits(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);

void GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_InitStruct);

#endif

